I think it's very difficult to say "My son said X and yours said Y, so yours must be lying because mine never would." We can all get burned by that or feel insulted - and if we're wrong about our own kids, it's worse. Even if it's true, you don't get anywhere with it. Depending on the age of the kids, you could let them work it out. But I think it's okay to call the mom and say, "I think there is some misunderstanding. My son intended to let your son play with the toy for the day, but he'd like it back. I think it was a loan and not a trade, as my son didn't take home anything of your son's." Say it lightly and casually, and finish with "So, can Johnny bring the toy back to my son at camp tomorrow?"
Donating is a nice idea but it highlights that the other boy hasn't any toys, which may make him feel even worse than he does now. You could organize a toy exchange perhaps, where everyone brings something and gets to take something else home - just like recycling. It works best when families have kids of different ages so that a toy that's "too young" for her son can be picked up by someone with younger kids.
I'm sure the other boy is saying he has this toy or that hat to be in good standing with the other kids.
If you call and ask if the boys can talk, and they you put your son on the phone, who will then proceed to tell this boy that he's a liar and a thief, then the other mom will view you as being complicit in setting this all up. She'll probably be ticked that you bypassed her in order to accuse her son. So let the boys work it out in camp, or you call mom-to-mom with the "misunderstanding" approach.